package br.ucb.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.ucb.dao.UsuarioDAO;
import br.ucb.entidade.Usuario;

public class UsuarioDAOImpl extends AbstractEntidadeDAO<Usuario> implements UsuarioDAO{

	@Override
	protected List<Object> doPreparedStatement(Usuario entidade,
			StringBuffer query) {
		
		Usuario usuario = (Usuario) entidade;
		List<Object> args = new ArrayList<Object>();
		
		if(usuario.getCpf()!=null){
			query.append(" AND cpf = ?");
			args.add(usuario.getCpf());
		}
		if(usuario.getSenha()!=null){
			query.append(" AND senha = ?");
			args.add(usuario.getSenha());
		}		
		if(usuario.getPrivilegio()!=null){
			query.append(" AND privilegio = ?");
			args.add(usuario.getPrivilegio());
		}
		
		query.append(";");
		
		return args;
	}

	@Override
	protected List<Object> getInsertValues(Usuario entidade, StringBuffer sql) {
		Usuario usuario = (Usuario) entidade;
		List<Object> args = new ArrayList<Object>();
		
		if(usuario.getCpf()!=null){
			sql.append("?,");
			args.add(usuario.getCpf());
		}		
		if(usuario.getSenha()!=null){
			sql.append("?,");
			args.add(usuario.getSenha());
		}
		if(usuario.getPrivilegio()!=null){
			sql.append("?,");
			args.add(usuario.getPrivilegio());
		}
		
		if(sql.charAt(sql.length()-1)==',')
			sql.deleteCharAt(sql.length()-1);
		
		return args;
	}

	@Override
	protected String getTableValues(Usuario entidade) {
		StringBuffer query = new StringBuffer();
		
		if(entidade.getCpf()!=null){
			query.append("cpf,");
		}		
		if(entidade.getPrivilegio()!=null){
			query.append("senha,");
		}
		if(entidade.getPrivilegio()!=null){
			query.append("privilegio,");
		}
		
		if(query.charAt(query.length()-1)==',')
			query.deleteCharAt(query.length()-1);
		
		return query.toString();
	}

	@Override
	protected List<Usuario> retornaListaEntidades(ResultSet resultado) {
		List<Usuario> lista = new ArrayList<Usuario>();
		try {
			while(resultado.next()){
				lista.add(new Usuario(resultado.getString(1), resultado.getString(2), resultado.getString(3)));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return lista;
	}

	@Override
	protected String doUpdate(Usuario entidade, List<Object> args) {
		StringBuffer update = new StringBuffer("update usuario set");
		
		if(entidade.getCpf()!=null){
			update.append(" cpf = ?,");
			args.add(entidade.getCpf());
		}		
		if(entidade.getSenha()!=null){
			update.append(" senha = ?,");
			args.add(entidade.getSenha());
		}		
		if(entidade.getPrivilegio()!=null){
			update.append(" privilegio = ?,");
			args.add(entidade.getPrivilegio());
		}
		if(update.charAt(update.length()-1)==',')
			update.deleteCharAt(update.length()-1);
		
		update.append(" where cpf = ?;");
		args.add(entidade.getCpf());
		
		return update.toString();
	}

	@Override
	protected void setTable() {
		super.table = "usuario";
	}

	@Override
	protected Usuario retornaEntidades(ResultSet resultado){
		Usuario user=null;
		try {
			while(resultado.next()){
				user = new Usuario(resultado.getString(1), resultado.getString(2), resultado.getString(3));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return user;
	}
}
